Apollo Server
https://www.apollographql.com/docs/apollo-server/
Apollo が開発した、GraphQL サーバを実装するための OSS ライブラリ
Resolver の定義
サンプル GraphQL Schema
code:schema.gql
type PostTag {
name: String!
}
type Post {
id: ID!
title: String!
body: String!
tags: PostTag!
}
interface User {
name: String!
}
type Author implements User {
name: String!
posts: Post!
}
type Query {
authors: Author!!
}
https://www.apollographql.com/docs/apollo-server/data/resolvers
Resolver は以下の 4 つの引数を受け取る関数である
https://www.apollographql.com/docs/apollo-server/data/resolvers#resolver-arguments
parent
親 Resolver の戻り値
Root Resolver 直下の場合は空になる
args
GraphQL Schema で定義したフィールドの呼び出し引数
context
GraphQL 操作全体で共有されるオブジェクト
DB コネクションやユーザの認証情報など、任意のデータを持たせることができる
info
その他の実行される操作に関する詳細情報
デバッグやエラー通知に含めるメッセージの生成などに用いられる
各フィールドで返却する値は、GraphQL Schema で定義した型と一致させる必要がある
e.g.
code:src/index.ts
const resolvers = {
Query: {
authors: () =>
Object.entries(db.users).map((id, user) => ({ id, ...user })),
},
Post: {
tags: ({ tags }) => tags.map((name) => ({ name })),
},
Author: {
posts: ({ id }) =>
Object.entries(db.blogs)
.filter((post) => post.author === id)
.map((id, post) => ({ id, ...post })),
},
};
Default resolvers
https://www.apollographql.com/docs/apollo-server/data/resolvers#default-resolvers
Resolver は GraphQL Schema で定義したすべての型やフィールドに対して定義できる
もし特定のフィールドに対してリゾルバを定義していない場合、Apollo Server はそのフィールドに対して Default resolvers を適用する
Default resolvers では、親のオブジェクトがフィールド名と同じプロパティを持つ場合にその値を返す
これにより、Post.title や Author.name などは Resolver を定義しなくても期待通りの値を返すようになる
サーバの起動
startStandaloneServer を用いることで、簡単にサーバを立ち上げることができる
ApolloServer のオプションには、Resolver を追加した GraphQL Schema をセットしている
GraphQL Schema ファイルを TypeScript で読み込む
code:src/index.ts
import { addResolversToSchema } from "@graphql-tools/schema";
import { ApolloServer } from "@apollo/server";
import { startStandaloneServer } from "@apollo/server/standalone";
const schemaWithResolvers = addResolversToSchema({ schema, resolvers });
const apolloServer = new ApolloServer({ schema: schemaWithResolvers });
const { url } = await startStandaloneServer(apolloServer);
console.log(url);
url のページを開くと、Apollo Sandbox というプレイグラウンド環境が起動する
https://scrapbox.io/files/66f1739c8f3872001de04652.png
Resolver chains
https://www.apollographql.com/docs/apollo-server/data/resolvers#resolver-chains
Root resolver から GraphQL Schema の最下層の Resolver まで処理が連鎖される仕組みや実行される順序のこと
Parser によって生成される AST を元に、自動的に解決される
これにより、GraphQL サーバはクライアントが指定したクエリを正しい順序で取得して返すことを保証する
生成される AST は https://astexplorer.net/ でクエリを入力すると確認できる
また、GraphQL サーバは AST と GraphQL Schema を比較し、クエリの有効性をチェックする
無効な場合、Resolver を実行することなくクライアントにエラーを返す
e.g.
code:gql
query GetPosts {
authors {
posts {
tags {
name
}
}
}
}
実行される Resolver の順序
code:mmd
code:mermaid
flowchart LR
Query.authors --> Author.posts --> Post.tags --> PostTag.name
e.g. 2
code:gql
query GetPosts {
authors {
name
posts {
title
body
tags {
name
}
}
}
}
実行される Resolver の順序
code:mermaid
flowchart LR
Query.authors --> Author.name
Query.authors --> Author.posts
Author.posts --> Post.tags --> PostTag.name
Author.posts --> Post.title
Author.posts --> Post.body
分岐したそれぞれのサブチェーンの Resolver は 並列 で実行される
#JavaScript #TypeScript #Node.js